//Promise构造函数 必须传一个执行器函数作为参数 p325
//try catch只能处理同步异常，promise的错误建议在catch中处理

let p1 = new Promise(
   //执行器executor 是一个立即执行函数
   (resolve,reject)=>{  //同步
    console.log(1);
    resolve('3');       //异步
   }
);


//setTimeout是宏任务，但里面任务不会不会立刻放进消息队列，而是创建一个延迟任务
//延迟任务会被推进延迟任务队列，等同个上下文的宏任务执行完，计时器会判断倒计时完就压入消息队列并执行
setTimeout(()=>{
   console.log(666)  //异步里的宏任务
},0)



// 期约里的实例方法:then  是一个微任务，是为期约添加处理程序的主要方法,参数是函数
//queueMicrotask()-微任务API  then会把onResolved/onReject处理程序推进消息队列

p1.then((success)=>{
   return new Promise(
      (resolve,reject)=>{
         console.log(success)
         setTimeout(() => {
            reject(5);
         }, 1000);
      }
   )
})
.catch(console.log);

console.log(2);
//输出顺序为1 2 3





class PromiseDemo {

   promiserun(){
       return new Promise((resolve,reject)=>{
          //console.log('now');
          setTimeout(()=>{
              resolve(4);
          },1000)
       })
   }

}

const run = async function(){
   const Demo = new PromiseDemo();
   const result = await Demo.promiserun();
   
   console.log(result);
}


run();